import { Logger } from './logger.js';

export class ErrorHandler {
  static handleConnectionError(error) {
    const message = error.message.toLowerCase();

    if (message.includes('econnrefused')) {
      return '连接被拒绝 - 请检查服务器地址和端口是否正确';
    }
    if (message.includes('etimedout')) {
      return '连接超时 - 服务器响应时间过长，请检查网络连接';
    }
    if (message.includes('enotfound')) {
      return '域名解析失败 - 请检查服务器地址是否正确';
    }
    if (message.includes('permission denied')) {
      return '权限被拒绝 - 请检查用户名和密码/私钥是否正确';
    }
    if (message.includes('invalid privatekey')) {
      return '私钥格式无效 - 请确保使用 OpenSSH 格式的私钥';
    }
    if (message.includes('passphrase required')) {
      return '私钥需要密码短语 - 请在配置中添加 passphrase';
    }
    if (message.includes('all configured authentication methods failed')) {
      return '身份验证失败 - 所有认证方法都已失败，请检查凭证';
    }

    return `连接错误: ${error.message}`;
  }

  static handleFileOperationError(error, operation) {
    const message = error.message.toLowerCase();

    if (message.includes('no such file')) {
      if (operation.includes('上传')) {
        return `${operation} 失败 - 本地文件不存在，请检查文件路径是否正确`;
      }
      return `${operation} 失败 - 远程文件或目录不存在`;
    }
    if (message.includes('permission denied')) {
      return `${operation} 失败 - 权限不足，请检查用户是否有读写权限`;
    }
    if (message.includes('file already exists')) {
      return `${operation} 失败 - 文件已存在，请使用不同的名称`;
    }
    if (message.includes('is not a directory')) {
      return `${operation} 失败 - 指定的路径不是目录，上传时请指定完整的文件路径（如：/home/user/file.txt）`;
    }
    if (message.includes('read-only file system')) {
      return `${operation} 失败 - 文件系统为只读`;
    }
    if (message.includes('failure') || message.includes('ssh_fx_failure')) {
      return `${operation} 失败 - 可能的原因：
  1. 远程路径不存在（如果上传，请指定完整文件路径）
  2. 用户没有该目录的写入权限
  3. 磁盘空间不足
  4. 网络连接不稳定`;
    }

    return `${operation} 失败: ${error.message}`;
  }

  static handleAndLog(error, context = '') {
    const errorMessage = error.message || String(error);
    Logger.error(errorMessage);

    if (context) {
      Logger.debug(`上下文: ${context}`);
    }

    if (error.code) {
      Logger.debug(`错误代码: ${error.code}`);
    }

    return error;
  }

  static validatePath(path) {
    if (!path || typeof path !== 'string') {
      throw new Error('路径无效 - 路径必须是非空字符串');
    }

    // 防止路径遍历攻击的基本检查
    if (path.includes('..')) {
      Logger.warn('警告: 检测到路径遍历序列');
    }

    return path;
  }

  static validateConfig(config) {
    const errors = [];

    if (!config.host) errors.push('缺少 host');
    if (!config.username) errors.push('缺少 username');
    if (!config.port || config.port < 1 || config.port > 65535) {
      errors.push('port 无效');
    }
    if (!config.authType) errors.push('缺少 authType');

    return errors;
  }
}
